import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Param,
  Body,
  Query,
} from '@nestjs/common';
import { SingerService } from './singer.service';
import { Singer } from '../../entities/singer.entity';
import { PageSingerItemtDto } from '../../dto/singer/singer.dto';
import {
  ApiTags,
  ApiOperation,
  ApiBody,
  ApiOkResponse,
  ApiParam,
  ApiQuery,
  ApiBearerAuth,
} from '@nestjs/swagger';
import { PaginatedResponseDto } from '../../common/class/res.class';
import { Public } from '../../common/decorators/public.decorator';

@ApiTags('歌手') // 设置 Swagger 标签为 Singers
@ApiBearerAuth()
@Controller('singers') // 控制器路由前缀为 singers
export class SingerController {
  constructor(private readonly singerService: SingerService) {}

  @Post('save')
  @ApiOperation({ summary: '创建新歌手' }) // 操作的摘要为 创建新歌手
  @ApiBody({ type: Singer, description: '要创建的歌手对象' }) // 指定请求体的类型和描述信息
  @ApiOkResponse({ description: '成功创建歌手' }) // 成功响应的描述信息
  async createSinger(@Body() singerData: Partial<Singer>): Promise<Singer> {
    return await this.singerService.createSinger(singerData);
  }

  @Get('page')
  @ApiOperation({ summary: '分页获取歌手信息' }) // 操作的摘要为 分页获取歌手信息
  @ApiQuery({
    name: 'pageSize',
    description: '每页数量',
    type: 'number',
    required: false,
  }) // 查询参数描述为 每页数量
  @ApiQuery({
    name: 'pageNo',
    description: '当前页码',
    type: 'number',
    required: false,
  }) // 查询参数描述为 当前页码
  @ApiOkResponse({ description: '返回分页结果' }) // 成功响应的描述信息
  async page(
    @Query() query: PageSingerItemtDto,
  ): Promise<PaginatedResponseDto<Singer>> {
    const [records, total] = await this.singerService.page(query);
    return {
      msg: '查询成功',
      data: {
        records,
        pageSize: query.pageSize,
        pageNo: query.pageNo,
        total,
      },
    };
  }
  @Get('pollList')
  @ApiOperation({ summary: '根据ID获取歌手信息' }) // 操作的摘要为 根据ID获取歌手信息
  @ApiParam({ name: 'pollId', description: '项目ID', type: 'string' }) // 参数描述为 歌手ID
  @ApiOkResponse({ description: '返回指定ID的歌手信息' }) // 成功响应的描述信息
  async getPollIdAllSingers(
    @Query('pollId') pollId: string,
  ): Promise<Singer[]> {
    return await this.singerService.getPollIdAllSingers(pollId);
  }
  @Get('all')
  @ApiOperation({ summary: '获取所有歌手' }) // 操作的摘要为 获取所有歌手
  @ApiOkResponse({ description: '返回所有歌手' }) // 成功响应的描述信息
  async getAllSingers(): Promise<Singer[]> {
    return await this.singerService.getAllSingers();
  }

  @Get(':id')
  @ApiOperation({ summary: '根据ID获取歌手信息' }) // 操作的摘要为 根据ID获取歌手信息
  @ApiParam({ name: 'id', description: '歌手ID', type: 'string' }) // 参数描述为 歌手ID
  @ApiOkResponse({ description: '返回指定ID的歌手信息' }) // 成功响应的描述信息
  async getSingerById(@Param('id') id: string): Promise<Singer> {
    return await this.singerService.getSingerById(id);
  }

  @Post('edit')
  @ApiOperation({ summary: '更新歌手信息' }) // 操作的摘要为 更新歌手信息
  @ApiBody({ type: Singer, description: '要更新的歌手对象' }) // 指定请求体的类型和描述信息
  @ApiOkResponse({ description: '成功更新歌手信息' }) // 成功响应的描述信息
  async updateSinger(@Body() updateData: Partial<Singer>): Promise<Singer> {
    return await this.singerService.updateSinger(updateData);
  }

  @Delete('delete')
  @ApiOperation({ summary: '删除歌手' }) // 操作的摘要为 删除歌手
  @ApiBody({ type: Singer, description: '删除歌手对象' })
  @ApiOkResponse({ description: '成功删除歌手' }) // 成功响应的描述信息
  async deleteSinger(@Body() obj: any): Promise<void> {
    return await this.singerService.deleteSinger(obj.id);
  }
}
